
#include "DocumentosRecuperados.h"
#include <string.h>
#include <math.h>

DocumentosRecuperados::DocumentosRecuperados() {
}

DocumentosRecuperados::~DocumentosRecuperados() {
	std::list<documento*>::iterator it = this->lista_documentos.begin();
	while(it != this->lista_documentos.end()) {
		delete[] ((*it)->valores);
		delete (*it);
		it++;
	}
}

void DocumentosRecuperados::set_cantidad_terminos_consulta(int cantidad_terminos_consulta) {
	this->cantidad_terminos_consulta = cantidad_terminos_consulta;
}
void DocumentosRecuperados::agregar_doc(int id_doc, int frec, int pos_termino) {
	std::list<documento*>::iterator it = this->lista_documentos.begin();
	bool encontrado = false;
	while (( it != this->lista_documentos.end()) && (!encontrado)) {
		documento* doc = (*it);
		if (doc->id_doc == id_doc) {
			doc->valores[pos_termino] = frec;
			encontrado = true;
		}
		it++;
	}

	if(!encontrado) {
		documento* doc = new documento;
		memset(doc,0,sizeof(documento));
		doc->id_doc = id_doc;
		doc->valores = new float[this->cantidad_terminos_consulta];
		memset(doc->valores,0, (sizeof(float)*this->cantidad_terminos_consulta));
		doc->valores[pos_termino] = frec;
		doc->cantidad_terminos = this->cantidad_terminos_consulta;
		doc->norma = 0;
		doc->ranking = 0;
		this->lista_documentos.push_back(doc);
	}
}

void DocumentosRecuperados::cargar_norma(int* normas_doc) {
	std::list<documento*>::iterator it = this->lista_documentos.begin();
	while (it != this->lista_documentos.end()) {
		documento* doc = (*it) ;
		doc->norma = normas_doc[doc->id_doc+2];
		it++;
	}
}

void DocumentosRecuperados::rankear_docs(vector_consulta* consulta) {
	std::list<documento*>::iterator it = this->lista_documentos.begin();
	while (it != this->lista_documentos.end()) {
		documento* doc = (*it) ;
		int i = 0;
		float acumulador = 0;
		while ( i < doc->cantidad_terminos) {
			if (consulta->encontrado[i]) {
				float aux =( doc->valores[i] * (1+ log(this->cantidad_total_docs/ consulta->cant_doc_termino[i])));
				float aux2 = sqrtf(doc->norma) * sqrtf(consulta->norma);
				aux = aux / aux2;
				acumulador = acumulador + aux;
			}
			i++;
		}
		doc->norma = acumulador;
		it++;
	}
}

void DocumentosRecuperados::set_cant_total_docs(int cantidad_total_docs) {
	this->cantidad_total_docs = cantidad_total_docs;
}

int* DocumentosRecuperados::pedir_relevantes(int cantidad, int* cantidad_devueltos) {
	int* id_docs = new int[cantidad];
	memset(id_docs, 0, sizeof(int)*cantidad);
	float auxi = 0;
	bool salida = false;
	(*cantidad_devueltos) = 0;
	while (((*(cantidad_devueltos)) < cantidad) && (!salida)) {
		auxi = 0;
		std::list<documento*>::iterator it = this->lista_documentos.begin();
		std::list<documento*>::iterator aux = this->lista_documentos.begin();
		if (it == this->lista_documentos.end()) {
			salida = true;
		}
		else {
			while (it != this->lista_documentos.end()) {
				documento* doc = (*it);
				if (doc->norma > auxi) {
					auxi = doc->norma;
					aux = it;
				}
				it++;
			}
			id_docs[(*cantidad_devueltos)] = (*aux)->id_doc;
			documento* auxiliar = *aux;
			this->lista_documentos.erase(aux);
			delete[] auxiliar->valores;
			delete auxiliar;
			(*cantidad_devueltos)++;
		}
	}
	return id_docs;
}
